#ifndef TYPELIST_H
#define TYPELIST_H

namespace bga
{
template< typename H, typename T >
struct TypeList
{
    H head;     /// The head of the list
    T tail;     /// the Tail of the list
};

struct NullType{};  /// Generally, to end the list

}

/// In the new norm, use variadic template

#define TYPELIST_1(t1) \
            bga::TypeList< t1, bga::NullType >
#define TYPELIST_2(t1, t2) \
            bga::TypeList< t1, TYPELIST_1(t2) >
#define TYPELIST_3(t1, t2, t3) \
            bga::TypeList< t1, TYPELIST_2(t2, t3) >
#define TYPELIST_4(t1, t2, t3, t4) \
            bga::TypeList< t1, TYPELIST_3(t2, t3, t4) >
#define TYPELIST_5(t1, t2, t3, t4, t5) \
            bga::TypeList< t1, TYPELIST_4(t2, t3, t4, t5) >
#define TYPELIST_6(t1, t2, t3, t4, t5, t6) \
            bga::TypeList< t1, TYPELIST_5(t2, t3, t4, t5, t6) >
#define TYPELIST_7(t1, t2, t3, t4, t5, t6, t7) \
            bga::TypeList< t1, TYPELIST_6(t2, t3, t4, t5, t6, t7) >
#define TYPELIST_8(t1, t2, t3, t4, t5, t6, t7, t8) \
            bga::TypeList< t1, TYPELIST_7(t2, t3, t4, t5, t6, t7, t8) >
#define TYPELIST_9(t1, t2, t3, t4, t5, t6, t7, t8, t9) \
            bga::TypeList< t1, TYPELIST_8(t2, t3, t5, t6, t7, t8, t9) >
#define TYPELIST_10(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) \
            bga::TypeList< t1, TYPELIST_9(t2, t3, t5, t6, t7, t8, t9, t10) >

#endif // TYPELIST_H

